package br.ufmt.model;

import java.util.ArrayList;

import br.ufmt.exception.MidiaException;

/**
 * Representa as m�dias de uma determinada Obra
 * @author jppreti
 *
 */
public class Midia {
	
	public static ArrayList<Midia> midias = new ArrayList<Midia>();
	/**
	 * @see locadora.Obra
	 */
	private Obra obra;
	/**
	 * @see locadora.MidiaEnum
	 */
	private MidiaEnum tipoMidia;
	/**
	 * Quantidade de C�pias dessa obra nesse tipo de m�dia
	 */
	private int qtde;
	
	private String id;
	
	public Midia(String id, Obra obra, MidiaEnum tipoMidia, int qtde) throws MidiaException {
		setObra(obra);
		setTipoMidia(tipoMidia);
		setQtde(qtde);
		setId(id);
	}
	
	public Midia(Obra obra, MidiaEnum tipoMidia, int qtde) throws MidiaException {
		setObra(obra);
		setTipoMidia(tipoMidia);
		setQtde(qtde);
		setId();
	}
	

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	private void setId() {
		this.id = Integer.toString(this.hashCode());
		
	}

	public Obra getObra() {
		return obra;
	}

	public MidiaEnum getTipoMidia() {
		return tipoMidia;
	}

	public int getQtde() {
		return qtde;
	}

	public void setObra(Obra obra) throws MidiaException {
		if (obra==null) throw new MidiaException(MidiaException.OBRA_OBRIGATORIO);
		this.obra = obra;
	}

	public void setTipoMidia(MidiaEnum tipoMidia) throws MidiaException {
		if (tipoMidia==null) throw new MidiaException(MidiaException.TIPO_MIDIA_OBRIGATORIO);
		this.tipoMidia = tipoMidia;
	}

	public void setQtde(int qtde2) throws MidiaException {
		if (qtde2<=0) throw new MidiaException(MidiaException.QTDE_VALOR);
		this.qtde = qtde2;
	}

	/**
	 * Guarda uma refer�ncia do objeto em um vetor
	 */
	public void salvar() {
		if (!midias.contains(this))
			midias.add(this);
	}
	
	/**
	 * Remove a refer�ncia do objeto do vetor
	 */
	public void excluir() {
		midias.remove(this);
	}
	
	/**
	 * Busca a m�dia de uma determinada obra
	 * @param obra a ser pesquisada
	 * @param tipoMidia tipo de m�dia desejada da obra
	 * @return Objeto M�dia
	 */
	public static Midia getMidia(Obra obra, MidiaEnum tipoMidia) {
		for (Midia m: midias)
			if (m.getObra().equals(obra) & m.getTipoMidia()==tipoMidia) return m;
		return null;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((obra == null) ? 0 : obra.hashCode());
		result = prime * result
				+ ((tipoMidia == null) ? 0 : tipoMidia.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Midia other = (Midia) obj;
		if (obra == null) {
			if (other.obra != null)
				return false;
		} else if (!obra.equals(other.obra))
			return false;
		if (tipoMidia != other.tipoMidia)
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "Obra: " + getObra() + " - " + getTipoMidia() + " (" + getQtde() + ")" + "\n";
	           
	}
	
	static {
		try {
			new Midia(Obra.getObraPorNome("Immortals"),MidiaEnum.BD,(byte)3).salvar();
			new Midia(Obra.getObraPorNome("Immortals"),MidiaEnum.DVD,(byte)4).salvar();
			new Midia(Obra.getObraPorNome("F�ria de Tit�s"),MidiaEnum.BD,(byte)2).salvar();
			new Midia(Obra.getObraPorNome("F�ria de Tit�s"),MidiaEnum.DVD,(byte)3).salvar();
			new Midia(Obra.getObraPorNome("F�ria de Tit�s 2"),MidiaEnum.BD,(byte)4).salvar();
			new Midia(Obra.getObraPorNome("F�ria de Tit�s 2"),MidiaEnum.DVD,(byte)2).salvar();
			new Midia(Obra.getObraPorNome("Matrix 1"),MidiaEnum.BD,(byte)3).salvar();
			new Midia(Obra.getObraPorNome("Matrix 1"),MidiaEnum.DVD,(byte)5).salvar();
		} catch (MidiaException e) {
			e.printStackTrace();
		}
	}
}
